﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<vector>
using namespace std;
//栈作为容器适配器​​容器适配器，基于现有容器封装​​，
//仅提供特定接口（如栈的 LIFO、队列的 FIFO），不直接管理内存。

template<class T, class Container = vector<T>>//对于模板，也能使用缺省参数；这里的Container为容器，这里使用vector<T>作为默认缺省参数，用以stack的底层
class stack
{
public:
	bool empty()const 
	{
		return _con.empty();
	}
	size_t size()const
	{
		return _con.size();
	}
	T& top()//T&类型接收返回值时可修改
	{
		return _con.back();
	}
	const T& top()const//T&类型接收返回值时不可修改，但用T接收常量会进行拷贝，因此可修改
	{//需要注意的是，该const top函数重载并非仅为了支持const stack的拷贝构造，
	 //也可以使用const stack接收其他stack（如函数作用本身不用更改stack时，可避免误操作）
		return _con.back();
	}
	void push(const T& s)
	{
		_con.push_back(s);
	}
	void pop()
	{
		_con.pop_back();
	}
	//void swap(stack<T, Container = vector<T>>& other)//注意这里要显示传容器类型，但也需注意，
	//类模板的缺省参数只能在​​类模板的声明处​​指定一次（即在类定义的开头），不能在成员函数的参数列表中重复指定。
	//正确写法应为：
	void swap(stack<T, Container>& other)//类模板的缺省参数会自动继承​
	{
		_con.swap(other._con);
	}
private:
	Container _con;
};

void test()
{
	stack<int> st;
	st.push(1);
	st.push(2);
	st.push(3);
	stack<int> sts;
	sts.push(9);
	st.swap(sts);
	while (!st.empty())
	{
		cout << st.top() << " ";//9
		st.pop();
	}
	cout << endl;

	while (sts.size() > 0)
	{
		cout << sts.top() << " ";//3 2 1
		sts.pop();
	}
	cout << endl;

	//top函数的非const重载函数
	stack<int> st3;
	st3.push(1);
	cout << st3.top() << endl;//1\n
	int& top1 = st3.top();
	top1 = 999;
	cout << st3.top() << endl;//999\n->引用类型接收top改变原值
	int top2 = st3.top();
	top2 = 666;
	cout << st3.top() << endl;//999\n->非引用类型接收不会改变原值

	//top函数的const重载函数
	const stack<int> st4 = st3;
	cout << st4.top() << endl;//999\n
	const int& top3 = st4.top();
	//top3 = 666;//报错，const类型的top3禁止被更改
	//cout << st4.top() << endl;//999\n
	int top4 = st4.top();
	top4 = 666;
	cout << st4.top() << endl;//999\n->非引用类型接收不会改变原值
}

int main()
{
	test();
	return 0;
}
